
#include "GestorBloquesLibres.h"
#include "../Utilitarios/Utilitarios.h"

GestorBloquesLibres::GestorBloquesLibres(string rutaArchivo) {
	this->persistor = new Persistor(rutaArchivo, sizeof(int));
	if(!this->persistor->abrirArchivo()){
		this->persistor->crearArchivo();
		this->persistor->abrirArchivo();
	}
}

void GestorBloquesLibres::eliminarPrimerBloque(){
	if(this->persistor->getCantidadBloques() > 0){
		Persistor* nuevo_persistor = new Persistor(this->persistor->getRuta() + ".temp",sizeof(int));
		nuevo_persistor->crearArchivo();
		nuevo_persistor->abrirArchivo();
		CadenaBytes contenido;
		contenido.agregarAlFinal(this->persistor->leerNBloques(1,this->persistor->getCantidadBloques()-1));
		nuevo_persistor->agregarNBloques(this->persistor->getCantidadBloques()-1);
		nuevo_persistor->guardarNBloques(0,this->persistor->getCantidadBloques() -1,contenido);
		this->persistor->cerrarArchivo();
		this->persistor->removerArchivo();
		nuevo_persistor->renombrarArchivo(this->persistor->getRuta());
		delete this->persistor;
		this->persistor = nuevo_persistor;
	}
}

void GestorBloquesLibres::eliminarUltimoBloque(){
	if(this->persistor->getCantidadBloques() > 0){
		Persistor* nuevo_persistor = new Persistor(this->persistor->getRuta() + ".temp",sizeof(int));
		nuevo_persistor->crearArchivo();
		nuevo_persistor->abrirArchivo();
		CadenaBytes contenido;
		contenido.agregarAlFinal(this->persistor->leerNBloques(0,this->persistor->getCantidadBloques()-1));
		nuevo_persistor->agregarNBloques(this->persistor->getCantidadBloques()-1);
		nuevo_persistor->guardarNBloques(0,this->persistor->getCantidadBloques() -1,contenido);
		this->persistor->cerrarArchivo();
		this->persistor->removerArchivo();
		nuevo_persistor->renombrarArchivo(this->persistor->getRuta());
		delete this->persistor;
		this->persistor = nuevo_persistor;
	}
}

void GestorBloquesLibres::agregarBloqueLibre(int nroAAgregar){
	this->persistor->agregarBloque();
	CadenaBytes cadena;
	cadena.agregarAlFinal(&nroAAgregar,sizeof(int));
	this->persistor->guardarBloque(this->persistor->getCantidadBloques()-1,cadena);
}

bool GestorBloquesLibres::hayLibres(){
	return (this->persistor->getCantidadBloques() > 0);
}

int GestorBloquesLibres::cantidadLibres(){
	return this->persistor->getCantidadBloques();
}

int GestorBloquesLibres::getBloqueLibre(){
	int bloqueLibre;
	if (this->persistor->getCantidadBloques() < 1){
		bloqueLibre = -1;
	}else{
		bloqueLibre = this->persistor->leerBloque(this->persistor->getCantidadBloques()-1).leerEntero(0);
		//this->eliminarPrimerBloque();
		this->eliminarUltimoBloque();
	}
	return bloqueLibre;
}

string GestorBloquesLibres::toString(){
	string cadena("Bloques libres: ");
	for(int i =0;i<this->persistor->getCantidadBloques(); i++){
		cadena += Utilitarios::intToString(this->persistor->leerBloque(i).leerEntero(0)) + " ";
	}
	cadena += "\n";
	return cadena;
}

GestorBloquesLibres::~GestorBloquesLibres() {
	this->persistor->cerrarArchivo();
	delete this->persistor;
}
